#include "TextUtils.h"

void output_file_segment(const std::string& filename, std::streamoff start_pos, std::streamoff length) {
    // 1. 打开文件
    std::ifstream ifs(filename, std::ios::binary); // 建议使用 binary 模式，确保 seekg 准确
    
    // 检查文件是否成功打开
    if (!ifs.is_open()) {
        std::cerr << "错误：无法打开文件 " << filename << std::endl;
        return;
    }

    // 2. 移动文件指针到起始偏移量 (Seek to the start position)
    // 利用 seekg() 函数进行定位
    if (!ifs.seekg(start_pos)) {
        std::cerr << "错误：定位文件到偏移量 " << start_pos << " 失败。" << std::endl;
        return;
    }
    
    std::cout << "--- 文件段落内容输出 (偏移量: " << start_pos << ", 长度: " << length << ") ---" << std::endl;
    
    // 3. 读取指定长度的内容
    // 使用 std::vector 或 char 数组来存储读取到的内容
    
    // 分配一个 std::vector<char> 来存储要读取的数据
    // 注意：将 streamoff 转换为 size_t
    std::vector<char> buffer(static_cast<std::size_t>(length));
    
    // 使用 read() 函数读取指定长度的数据
    ifs.read(buffer.data(), length);
    
    // 检查读取操作的状态
    if (ifs.fail() && !ifs.eof()) {
        std::cerr << "警告：文件读取操作失败或未完全读取到指定长度。" << std::endl;
    }
    
    // 4. 将读取到的内容输出到控制台
    // 直接将 vector 中的数据作为字符串输出 (注意处理非文本文件中的不可打印字符)
    // 由于是从文件中读取字节流，这里我们直接将 buffer 视为一个字符数组输出
    std::cout.write(buffer.data(), ifs.gcount());
    
    std::cout << "\n--- 文件段落输出结束 (实际读取长度: " << ifs.gcount() << ") ---" << std::endl;
    
    // 5. 文件流对象 ifs 在函数结束时会自动关闭（析构函数自动调用，体现了 RAII 的思想！）
}

int main() {
    const string FILENAME = "../corpus/page_library.dat";
    
    ifstream ifs { FILENAME };
    streamoff test_start_pos = 9732986;
    streamoff test_length = 22324;
    output_file_segment(FILENAME, test_start_pos, test_length);
    // Document doc = get_document(ifs, test_start_pos, test_length);

    // cout << "id:" << doc.id << endl;
    // cout << "title:" << doc.title << endl;
    // cout << "link:" << doc.link << endl;
    // cout << "content:" << doc.content << endl;
    
    return 0;
}
